home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / src / emog.lha / parser.y < prev    next >
Encoding:
Lex Description  |  2000-03-07  |  24.9 KB  |  939 lines

  1. %{
  2.  
  3. OPT PREPROCESS
  4.  
  5. MODULE  'amigalib/lists'    ,
  6.     '*tools'            ,
  7.     '*absy'
  8.  
  9. /*
  10.    If SHOWCALLS is set, each call of a function will be
  11.    shown in more or less complex form.
  12.    If SHOWRAISE is set, everytime an exception is raised,
  13.    this will be shown including the place where this happened.
  14.  
  15.  */
  16.  
  17. -> #define SHOWCALLS
  18. -> #define SHOWRAISE
  19.  
  20.  
  21. EXPORT DEF result
  22. EXPORT DEF glinput
  23. DEF keyword
  24.  
  25. ->> ALLFUNCS
  26.  
  27. /*
  28.  
  29.   Following functions are of primitive kind since they only
  30.   are used for constructing the syntax tree.
  31.  
  32.  */
  33.  
  34. ->> PROC allocAbsy
  35. PROC allocAbsy( all_variant, all_top = 0 )
  36. DEF all_absy : PTR TO absy
  37.  
  38. #ifdef SHOWCALLS
  39.   WriteF( 'allocAbsy()\n' )
  40. #endif
  41. #ifndef SHOWCALLS
  42.   displayGauge()
  43. #endif
  44.  
  45.   all_absy := NIL
  46.  
  47.   SELECT all_variant
  48.   CASE VARIANT_INCLUDEFILE     ; all_absy := New( all_top + SIZEOF includefile    )
  49.   CASE VARIANT_STRUCT          ; all_absy := New( all_top + SIZEOF struct         )
  50.   CASE VARIANT_POINTING        ; all_absy := New( all_top + SIZEOF pointing       )
  51.   CASE VARIANT_TYPE            ; all_absy := New( all_top + SIZEOF type           )
  52.   CASE VARIANT_ARGUMENT        ; all_absy := New( all_top + SIZEOF argument       )
  53.   CASE VARIANT_ARGS            ; all_absy := New( all_top + SIZEOF args           )
  54.   CASE VARIANT_FUNCTION        ; all_absy := New( all_top + SIZEOF function       )
  55.   CASE VARIANT_EXPRESSION      ; all_absy := New( all_top + SIZEOF expression     )
  56.   CASE VARIANT_CONSTANT        ; all_absy := New( all_top + SIZEOF constant       )
  57.   CASE VARIANT_INCFILE         ; all_absy := New( all_top + SIZEOF incfile        )
  58.   CASE VARIANT_CONDITIONAL     ; all_absy := New( all_top + SIZEOF conditional    )
  59.   CASE VARIANT_IDELIST         ; all_absy := New( all_top + SIZEOF idelist        )
  60.   CASE VARIANT_COMPONENT       ; all_absy := New( all_top + SIZEOF component      )
  61.   CASE VARIANT_COMPS           ; all_absy := New( all_top + SIZEOF comps          )
  62.   CASE VARIANT_STRUCT          ; all_absy := New( all_top + SIZEOF struct         )
  63.   CASE VARIANT_VARIABLE        ; all_absy := New( all_top + SIZEOF variable       )
  64.   CASE VARIANT_IDEARRAYED      ; all_absy := New( all_top + SIZEOF idearrayed     )
  65.   CASE VARIANT_COMPRIGHT       ; all_absy := New( all_top + SIZEOF compright      )
  66.   CASE VARIANT_CAST            ; all_absy := New( all_top + SIZEOF cast           )
  67.   ENDSELECT
  68.  
  69.   IF all_absy = NIL
  70. #ifdef SHOWRAISE
  71.     WriteF( 'RAISE PARS: allocAbsy()\n' )
  72. #endif
  73.     Raise( "PARS" )
  74.   ENDIF
  75.  
  76.   all_absy.variant := all_variant
  77.  
  78.   IF CtrlC()
  79. #ifdef SHOWRAISE
  80.     WriteF( 'RAISE CTRL: allocAbsy()\n' )
  81. #endif
  82.     Raise( "CTRL" )
  83.   ENDIF
  84.  
  85. ENDPROC all_absy
  86. -><
  87.  
  88. ->> PROC newCast()
  89. PROC newCast( new_name, new_isstruct, new_pointing : PTR TO pointing )
  90. DEF new_cast : PTR TO cast
  91. DEF new_len
  92.  
  93. #ifdef SHOWCALLS
  94.   WriteF( 'newCast()\n' )
  95. #endif
  96. #ifndef SHOWCALLS
  97.   displayGauge()
  98. #endif
  99.  
  100.   new_len           := StrLen( new_name ) + 1
  101.   new_cast          := allocAbsy( VARIANT_CAST, new_len )
  102.   new_cast.pointing := new_pointing
  103.   new_cast.isstruct := new_isstruct
  104.   new_cast.name     := new_cast + SIZEOF cast
  105.   AstrCopy( new_cast.name, new_name )
  106.  
  107. ENDPROC new_cast
  108. -><
  109.  
  110. ->> PROC newPointing()
  111. PROC newPointing( new_pointing : PTR TO pointing )
  112.  
  113. #ifdef SHOWCALLS
  114.   WriteF( 'newPointing()\n' )
  115. #endif
  116. #ifndef SHOWCALLS
  117.   displayGauge()
  118. #endif
  119.  
  120.   IF new_pointing = NIL
  121.     new_pointing        := allocAbsy( VARIANT_POINTING )
  122.     new_pointing.number := 0
  123.   ENDIF
  124.  
  125.   new_pointing.number := new_pointing.number + 1
  126.  
  127.   IF CtrlC()
  128. #ifdef SHOWRAISE
  129.     WriteF( 'RAISE CTRL: newPointing()\n' )
  130. #endif
  131.     Raise( "CTRL" )
  132.   ENDIF
  133.  
  134. ENDPROC new_pointing
  135. -><
  136.  
  137. ->> PROC newType()
  138. PROC newType( new_spec, new_name )
  139. DEF new_type : PTR TO type
  140. DEF new_len
  141.  
  142. #ifdef SHOWCALLS
  143.   WriteF( 'newType( TYP = \d, \s )\n', new_spec, new_name )
  144. #endif
  145. #ifndef SHOWCALLS
  146.   displayGauge()
  147. #endif
  148.  
  149.   new_len                := StrLen( new_name ) + 1
  150.   new_type               := allocAbsy( VARIANT_TYPE, new_len )
  151.   new_type.specification := new_spec
  152.   new_type.name          := new_type + SIZEOF type
  153.   AstrCopy( new_type.name, new_name, new_len )
  154.  
  155.   IF CtrlC()
  156. #ifdef SHOWRAISE
  157.     WriteF( 'RAISE CTRL: newType()\n' )
  158. #endif
  159.     Raise( "CTRL" )
  160.   ENDIF
  161.  
  162. ENDPROC new_type
  163. -><
  164.  
  165. ->> PROC newArgument()
  166. PROC newArgument( new_type, new_pointing, new_name )
  167. DEF new_arg : PTR TO argument
  168. DEF new_len
  169.  
  170. #ifdef SHOWCALLS
  171.   WriteF( 'newArgument()\n' )
  172. #endif
  173. #ifndef SHOWCALLS
  174.   displayGauge()
  175. #endif
  176.  
  177.   new_len           := IF new_name = NIL THEN 0 ELSE StrLen( new_name ) + 1
  178.   new_arg           := allocAbsy( VARIANT_ARGUMENT, new_len )
  179.   new_arg.type      := new_type
  180.   new_arg.pointing  := new_pointing
  181.  
  182.   IF new_len = 0
  183.     new_arg.name    := NIL
  184.   ELSE
  185.     new_arg.name    := new_arg + SIZEOF argument
  186.     AstrCopy( new_arg.name, new_name, new_len )
  187.   ENDIF
  188.  
  189.   IF CtrlC()
  190. #ifdef SHOWRAISE
  191.     WriteF( 'RAISE CTRL: newArgument()\n' )
  192. #endif
  193.     Raise( "CTRL" )
  194.   ENDIF
  195.  
  196. ENDPROC new_arg
  197. -><
  198.  
  199. ->> PROC newArgs()
  200. PROC newArgs( new_args : PTR TO args, new_arg : PTR TO argument )
  201.  
  202. #ifdef SHOWCALLS
  203.   WriteF( 'newArgs()\n' )
  204. #endif
  205. #ifndef SHOWCALLS
  206.   displayGauge()
  207. #endif
  208.  
  209.   IF new_args = NIL
  210.     new_args := allocAbsy( VARIANT_ARGS )
  211.     newList( new_args.arguments )
  212.   ENDIF
  213.  
  214.   AddTail( new_args.arguments, new_arg )
  215.  
  216.   IF CtrlC()
  217. #ifdef SHOWRAISE
  218.     WriteF( 'RAISE CTRL: newArgs()\n' )
  219. #endif
  220.     Raise( "CTRL" )
  221.   ENDIF
  222.  
  223. ENDPROC new_args
  224. -><
  225.  
  226. ->> PROC newIdeList()
  227. PROC newIdeList( new_idelist : PTR TO idelist, new_cr )
  228.  
  229. #ifdef SHOWCALLS
  230.   WriteF( 'newIdeList()\n' )
  231. #endif
  232. #ifndef SHOWCALLS
  233.   displayGauge()
  234. #endif
  235.  
  236.   IF new_idelist = NIL
  237.     new_idelist := allocAbsy( VARIANT_IDELIST )
  238.     newList( new_idelist.comprights )
  239.   ENDIF
  240.  
  241.   AddTail( new_idelist.comprights, new_cr )
  242.  
  243.   IF CtrlC()
  244. #ifdef SHOWRAISE
  245.     WriteF( 'RAISE CTRL: newIdeList()\n' )
  246. #endif
  247.     Raise( "CTRL" )
  248.   ENDIF
  249.  
  250. ENDPROC new_idelist
  251. -><
  252.  
  253. ->> PROC newFunc()
  254. PROC newFunc( new_type, new_pointing, new_name, new_args : PTR TO args, new_func : PTR TO function )
  255. DEF new_len
  256.  
  257. #ifdef SHOWCALLS
  258.   WriteF( 'newFunc()\n' )
  259. #endif
  260. #ifndef SHOWCALLS
  261.   displayGauge()
  262. #endif
  263.  
  264.   IF new_func = NIL
  265.  
  266.     new_len           := StrLen( new_name ) + 1
  267.     new_func          := allocAbsy( VARIANT_FUNCTION, new_len )
  268.     new_func.args     := new_args
  269.     new_func.name     := new_func + SIZEOF function
  270.     AstrCopy( new_func.name, new_name, new_len )
  271.  
  272.   ELSE
  273.     new_func.type     := new_type
  274.     new_func.pointing := new_pointing
  275.   ENDIF
  276.  
  277.   IF CtrlC()
  278. #ifdef SHOWRAISE
  279.     WriteF( 'RAISE CTRL: newFunc()\n' )
  280. #endif
  281.     Raise( "CTRL" )
  282.   ENDIF
  283.  
  284. ENDPROC new_func
  285. -><
  286.  
  287. ->> PROC newExpr()
  288. PROC newExpr( new_extyp, new_val, new_str, new_left, new_right )
  289. DEF new_expr : PTR TO expression
  290. DEF new_len
  291.  
  292. #ifdef SHOWCALLS
  293.   IF (new_extyp = EXTYP_ID) OR (new_extyp = EXTYP_STRING)
  294.     WriteF( 'newExpr( TYP = \d, str = \s )\n', new_extyp, new_str )
  295.   ELSEIF new_extyp = EXTYP_HEXVALUE
  296.     WriteF( 'newExpr( TYP = \d, val = $\h )\n', new_extyp, new_val )
  297.   ELSEIF new_extyp = EXTYP_DECVALUE
  298.     WriteF( 'newExpr( TYP = \d, val = \d )\n', new_extyp, new_val )
  299.   ELSE
  300.     WriteF( 'newExpr( TYP = \d )\n', new_extyp )
  301.   ENDIF
  302. #endif
  303. #ifndef SHOWCALLS
  304.   displayGauge()
  305. #endif
  306.  
  307.   IF (new_extyp = EXTYP_ID) OR (new_extyp = EXTYP_STRING)
  308.     new_len      := StrLen( new_str ) + 1
  309.   ELSE
  310.     new_len      := 0
  311.   ENDIF
  312.  
  313.   new_expr       := allocAbsy( VARIANT_EXPRESSION, new_len )
  314.   new_expr.extyp := new_extyp
  315.   new_expr.value := new_val
  316.   new_expr.left  := new_left
  317.   new_expr.right := new_right
  318.   new_expr.id    := NIL
  319.   new_expr.cast  := NIL
  320.  
  321.   IF new_len > 0
  322.     new_expr.id  := new_expr + SIZEOF expression
  323.     AstrCopy( new_expr.id, new_str, new_len )
  324.   ENDIF
  325.  
  326.   IF CtrlC()
  327. #ifdef SHOWRAISE
  328.     WriteF( 'RAISE CTRL: newExpr()\n' )
  329. #endif
  330.     Raise( "CTRL" )
  331.   ENDIF
  332.  
  333. ENDPROC new_expr
  334. -><
  335.  
  336. ->> PROC modifyExpr()
  337. PROC modifyExpr( mod_expr : PTR TO expression, mod_cast : PTR TO cast )
  338.  
  339. #ifdef SHOWCALLS
  340.   WriteF( 'Modifying expression !\n' )
  341. #endif
  342. #ifndef SHOWCALLS
  343.   displayGauge()
  344. #endif
  345.  
  346.   mod_expr.cast := mod_cast
  347.  
  348. ENDPROC
  349. -><
  350.  
  351. ->> PROC newConstant()
  352. PROC newConstant( new_name, new_expr )
  353. DEF new_const : PTR TO constant
  354. DEF new_len
  355.  
  356. #ifdef SHOWCALLS
  357.   WriteF( 'newConstant()\n' )
  358. #endif
  359. #ifndef SHOWCALLS
  360.   displayGauge()
  361. #endif
  362.  
  363.   new_len           := StrLen( new_name ) + 1
  364.   new_const         := allocAbsy( VARIANT_CONSTANT, new_len )
  365.   new_const.expr    := new_expr
  366.   new_const.id      := new_const + SIZEOF constant
  367.   AstrCopy( new_const.id, new_name, new_len )
  368.  
  369.   IF CtrlC()
  370. #ifdef SHOWRAISE
  371.     WriteF( 'RAISE CTRL: newConstant()\n' )
  372. #endif
  373.     Raise( "CTRL" )
  374.   ENDIF
  375.  
  376. ENDPROC new_const
  377. -><
  378.  
  379. ->> PROC newIncfile()
  380. PROC newIncfile( new_curr, new_path )
  381. DEF new_incfile : PTR TO incfile
  382.  
  383. #ifdef SHOWCALLS
  384.   WriteF( 'newIncfile()\n' )
  385. #endif
  386. #ifndef SHOWCALLS
  387.   displayGauge()
  388. #endif
  389.  
  390.   new_incfile         := allocAbsy( VARIANT_INCFILE )
  391.   new_incfile.current := new_curr
  392.   new_incfile.path    := new_path
  393.  
  394.   IF CtrlC()
  395. #ifdef SHOWRAISE
  396.     WriteF( 'RAISE CTRL: newIncfile()\n' )
  397. #endif
  398.     Raise( "CTRL" )
  399.   ENDIF
  400.  
  401. ENDPROC new_incfile
  402. -><
  403.  
  404. ->> PROC newConditional()
  405. PROC newConditional( new_name, new_incfile )
  406. DEF new_cond : PTR TO conditional
  407. DEF new_len
  408.  
  409. #ifdef SHOWCALLS
  410.   WriteF( 'newConditional()\n' )
  411. #endif
  412. #ifndef SHOWCALLS
  413.   displayGauge()
  414. #endif
  415.  
  416.   new_len           := StrLen( new_name ) + 1
  417.   new_cond          := allocAbsy( VARIANT_CONDITIONAL, new_len )
  418.   new_cond.include  := new_incfile
  419.   new_cond.neg      := FALSE
  420.   new_cond.test     := new_cond + SIZEOF conditional
  421.   AstrCopy( new_cond.test, new_name, new_len )
  422.  
  423.   IF CtrlC()
  424. #ifdef SHOWRAISE
  425.     WriteF( 'RAISE CTRL: newConditional()\n' )
  426. #endif
  427.     Raise( "CTRL" )
  428.   ENDIF
  429.  
  430. ENDPROC new_cond
  431. -><
  432.  
  433. ->> PROC newComp()
  434. PROC newComp( new_type, new_idelist )
  435. DEF new_comp : PTR TO component
  436.  
  437. #ifdef SHOWCALLS
  438.   WriteF( 'newComp()\n' )
  439. #endif
  440. #ifndef SHOWCALLS
  441.   displayGauge()
  442. #endif
  443.  
  444.   new_comp          := allocAbsy( VARIANT_COMPONENT )
  445.   new_comp.type     := new_type
  446.   new_comp.idelist  := new_idelist
  447.  
  448.   IF CtrlC()
  449. #ifdef SHOWRAISE
  450.     WriteF( 'RAISE CTRL: newComp()\n' )
  451. #endif
  452.     Raise( "CTRL" )
  453.   ENDIF
  454.  
  455. ENDPROC new_comp
  456. -><
  457.  
  458. ->> PROC newComps()
  459. PROC newComps( new_comps : PTR TO comps, new_component : PTR TO component )
  460.  
  461. #ifdef SHOWCALLS
  462.   WriteF( 'newComps()\n' )
  463. #endif
  464. #ifndef SHOWCALLS
  465.   displayGauge()
  466. #endif
  467.  
  468.   IF new_comps = NIL
  469.     new_comps := allocAbsy( VARIANT_COMPS )
  470.     newList( new_comps.components )
  471.   ENDIF
  472.  
  473.   AddTail( new_comps.components, new_component )
  474.  
  475.   IF CtrlC()
  476. #ifdef SHOWRAISE
  477.     WriteF( 'RAISE CTRL: newComps()\n' )
  478. #endif
  479.     Raise( "CTRL" )
  480.   ENDIF
  481.  
  482. ENDPROC new_comps
  483. -><
  484.  
  485. ->> PROC newStruct()
  486. PROC newStruct( new_name, new_components )
  487. DEF new_struct : PTR TO struct
  488. DEF new_len
  489.  
  490. #ifdef SHOWCALLS
  491.   WriteF( 'newStruct()\n' )
  492. #endif
  493. #ifndef SHOWCALLS
  494.   displayGauge()
  495. #endif
  496.  
  497.   new_len               := StrLen( new_name ) + 1
  498.   new_struct            := allocAbsy( VARIANT_STRUCT, new_len )
  499.   new_struct.components := new_components
  500.   new_struct.name       := new_struct + SIZEOF struct
  501.   AstrCopy( new_struct.name, new_name, new_len )
  502.  
  503.   IF CtrlC()
  504. #ifdef SHOWRAISE
  505.     WriteF( 'RAISE CTRL: newStruct()\n' )
  506. #endif
  507.     Raise( "CTRL" )
  508.   ENDIF
  509.  
  510. ENDPROC new_struct
  511. -><
  512.  
  513. ->> PROC newVar()
  514. PROC newVar( new_type, new_idelist )
  515. DEF new_var : PTR TO variable
  516.  
  517. #ifdef SHOWCALLS
  518.   WriteF( 'newVar()\n' )
  519. #endif
  520. #ifndef SHOWCALLS
  521.   displayGauge()
  522. #endif
  523.  
  524.   new_var         := allocAbsy( VARIANT_VARIABLE )
  525.   new_var.type    := new_type
  526.   new_var.idelist := new_idelist
  527.  
  528.   IF CtrlC()
  529. #ifdef SHOWRAISE
  530.     WriteF( 'RAISE CTRL: newVar()\n' )
  531. #endif
  532.     Raise( "CTRL" )
  533.   ENDIF
  534.  
  535. ENDPROC new_var
  536. -><
  537.  
  538. ->> PROC newIncludeFile()
  539. PROC newIncludeFile( new_incfile : PTR TO includefile, new_absy )
  540.  
  541. #ifdef SHOWCALLS
  542.   WriteF( 'newIncludeFile()\n' )
  543. #endif
  544. #ifndef SHOWCALLS
  545.   displayGauge()
  546. #endif
  547.  
  548.   IF new_incfile = NIL
  549.     new_incfile := allocAbsy( VARIANT_INCLUDEFILE )
  550.     newList( new_incfile.entries )
  551.   ENDIF
  552.  
  553.   AddTail( new_incfile.entries, new_absy )
  554.  
  555.   result := new_incfile
  556.  
  557.   IF CtrlC()
  558. #ifdef SHOWRAISE
  559.     WriteF( 'RAISE CTRL: newIncludeFile()\n' )
  560. #endif
  561.     Raise( "CTRL" )
  562.   ENDIF
  563.  
  564. ENDPROC new_incfile
  565. -><
  566.  
  567. ->> PROC newIdeArrayed()
  568. PROC newIdeArrayed( new_str, new_times )
  569. DEF new_ide : PTR TO idearrayed
  570.  
  571. #ifdef SHOWCALLS
  572.   WriteF( 'newIdeArrayed( \s, \d )\n', new_str, new_times )
  573. #endif
  574. #ifndef SHOWCALLS
  575.   displayGauge()
  576. #endif
  577.  
  578.   new_ide            := allocAbsy( VARIANT_IDEARRAYED )
  579.   new_ide.identifier := new_str
  580.   new_ide.times      := new_times
  581.  
  582.   IF CtrlC()
  583. #ifdef SHOWRAISE
  584.     WriteF( 'RAISE CTRL: newIdeArrayed()\n' )
  585. #endif
  586.     Raise( "CTRL" )
  587.   ENDIF
  588.  
  589. ENDPROC new_ide
  590. -><
  591.  
  592. ->> PROC newCompRight()
  593. PROC newCompRight( new_pointing : PTR TO pointing, new_idearrayed )
  594. DEF new_cr : PTR TO compright
  595.  
  596. #ifdef SHOWCALLS
  597.   IF new_pointing <> NIL
  598.     WriteF( 'newCompRight( \d )\n', new_pointing.number )
  599.   ELSE
  600.     WriteF( 'newCompRight( 0  )\n' )
  601.   ENDIF
  602. #endif
  603. #ifndef SHOWCALLS
  604.   displayGauge()
  605. #endif
  606.  
  607.   new_cr            := allocAbsy( VARIANT_COMPRIGHT )
  608.   new_cr.pointing   := new_pointing
  609.   new_cr.idearrayed := new_idearrayed
  610.  
  611.   IF CtrlC()
  612. #ifdef SHOWRAISE
  613.     WriteF( 'RAISE CTRL: newCompRight()\n' )
  614. #endif
  615.     Raise( "CTRL" )
  616.   ENDIF
  617.  
  618. ENDPROC new_cr
  619. -><
  620.  
  621. ->> PROC negotiateCond()
  622. PROC negotiateCond( neg_cond : PTR TO conditional )
  623.  
  624. #ifdef SHOWCALLS
  625.   WriteF( 'negotiateCond()\n' )
  626. #endif
  627. #ifndef SHOWCALLS
  628.   displayGauge()
  629. #endif
  630.  
  631.   neg_cond.neg := TRUE
  632.  
  633.   IF CtrlC()
  634. #ifdef SHOWRAISE
  635.     WriteF( 'RAISE CTRL: negotiateCond()\n' )
  636. #endif
  637.     Raise( "CTRL" )
  638.   ENDIF
  639.  
  640. ENDPROC neg_cond
  641. -><
  642.  
  643. ->> PROC concatStr()
  644. PROC concatStr( con_str1, con_str2 )
  645. DEF con_buffer [1024] : STRING
  646. DEF con_len,con_new
  647.  
  648.   IF con_str1 = NIL THEN con_str1 := ''
  649.   IF con_str2 = NIL THEN con_str2 := ''
  650.  
  651. #ifdef SHOWCALLS
  652.   WriteF( 'concatStr( \s, \s )', con_str1, con_str2 )
  653. #endif
  654. #ifndef SHOWCALLS
  655.   displayGauge()
  656. #endif
  657.  
  658.   StringF( con_buffer, '\s\s', con_str1, con_str2 )
  659.   con_len := StrLen( con_buffer ) + 1
  660.  
  661.   con_new := New( con_len )
  662.   IF con_new = NIL
  663. #ifdef SHOWRAISE
  664.     WriteF( 'RAISE PARS: concatStr()\n' )
  665. #endif
  666.     Raise( "PARS" )
  667.   ENDIF
  668.  
  669.   AstrCopy( con_new, con_buffer, con_len )
  670.  
  671. #ifdef SHOWCALLS
  672.   WriteF( ' = \s\n', con_new )
  673. #endif
  674.  
  675.   IF CtrlC()
  676. #ifdef SHOWRAISE
  677.     WriteF( 'RAISE CTRL: concatStr()\n' )
  678. #endif
  679.     Raise( "CTRL" )
  680.   ENDIF
  681.  
  682. ENDPROC con_new
  683. -><
  684.  
  685. ->> PROC asStr()
  686. PROC asStr( ass_value, ass_hex )
  687. DEF ass_buf [20] : STRING
  688. DEF ass_new,ass_len
  689.  
  690. #ifdef SHOWCALLS
  691.   IF ass_hex
  692.     WriteF( 'asStr( val = $\h, TRUE )\n', ass_value )
  693.   ELSE
  694.     WriteF( 'asStr( val = \d, FALSE )\n', ass_value )
  695.   ENDIF
  696. #endif
  697. #ifndef SHOWCALLS
  698.   displayGauge()
  699. #endif
  700.  
  701.   IF ass_hex <> FALSE
  702.     StringF( ass_buf , '0x\h' , ass_value )
  703.   ELSE
  704.     StringF( ass_buf , '\d'   , ass_value )
  705.   ENDIF
  706.  
  707.   ass_len := StrLen( ass_buf ) + 1
  708.  
  709.   ass_new := New( ass_len )
  710.   IF ass_new = NIL THEN Raise( "PARS" )
  711.   AstrCopy( ass_new, ass_buf, ass_len )
  712.  
  713.   IF CtrlC()
  714. #ifdef SHOWRAISE
  715.     WriteF( 'RAISE CTRL: asStr()\n' )
  716. #endif
  717.     Raise( "CTRL" )
  718.   ENDIF
  719.  
  720. ENDPROC ass_new
  721. -><
  722.  
  723. -><
  724.  
  725.  
  726. %}
  727.  
  728. %start INCLUDEFILE
  729.  
  730. %token PID PDECVALUE PHEXVALUE PEOF
  731.  
  732. %left '-' '+'
  733. %left '|' '&'
  734. %left '*' '/'
  735. %left '<' '>'
  736. %left '~'
  737. %left '(' ')'
  738. %left '[' ']'
  739. %left '"'
  740.  
  741. %%
  742.  
  743. INCLUDEFILE             : CONSTANT                                      { $$ := newIncludeFile( NIL , $1 )                          }
  744.             | INCLUSION                                     { $$ := newIncludeFile( NIL , $1 )                          }
  745.             | CONDITIONAL                                   { $$ := newIncludeFile( NIL , $1 )                          }
  746.             | STRUCT                                        { $$ := newIncludeFile( NIL , $1 )                          }
  747.             | FUNC                                          { $$ := newIncludeFile( NIL , $1 )                          }
  748.             | VARIABLE                                      { $$ := newIncludeFile( NIL , $1 )                          }
  749.             | INCLUDEFILE CONSTANT                          { $$ := newIncludeFile( $1  , $2 )                          }
  750.             | INCLUDEFILE INCLUSION                         { $$ := newIncludeFile( $1  , $2 )                          }
  751.             | INCLUDEFILE CONDITIONAL                       { $$ := newIncludeFile( $1  , $2 )                          }
  752.             | INCLUDEFILE STRUCT                            { $$ := newIncludeFile( $1  , $2 )                          }
  753.             | INCLUDEFILE FUNC                              { $$ := newIncludeFile( $1  , $2 )                          }
  754.             | INCLUDEFILE VARIABLE                          { $$ := newIncludeFile( $1  , $2 )                          }
  755.             ;
  756.  
  757. /*
  758.  
  759.   Yeah, yeah, some things aren't done yet.
  760.  
  761.  
  762. CAST                    : '(' CASTRIGHT                                 { $$ := $2                                                  }
  763.             ;
  764.  
  765. CASTRIGHT               : PID CASTEND                                   { $$ := newCast( $1 , FALSE , $2 )                          }
  766.             | STRUCTTYPE CASTEND                            { $$ := newCast( $1 , TRUE  , $2 )                          }
  767.             ;
  768.  
  769. CASTEND                 : ')'                                           { $$ := NIL                                                 }
  770.             | POINTING ')'                                  { $$ := $1                                                  }
  771.             ;
  772.  */
  773.  
  774. STRUCT                  : STRUCTTYPE '{' COMPS '}' ';'                  { $$ := newStruct( $1 , $3 )                                }
  775.             ;
  776.  
  777. TYPE                    : STRUCTTYPE                                    { $$ := newType( TYP_STRUCT  , $1 )                         }
  778.             | PID                                           { $$ := newType( TYP_DEFINED , $1 )                         }
  779.             ;
  780.  
  781. STRUCTTYPE              : 's' 't' 'r' 'u' 'c' 't' PID                   { $$ := $7                                                  }
  782.             ;
  783.  
  784. INCLUSION               : '#' 'i' 'n' 'c' 'l' 'u' 'd' 'e' INCFILE       { $$ := $9                                                  }
  785.             ;
  786.  
  787. CONSTANT                : '#' 'd' 'e' 'f' 'i' 'n' 'e' PID EXPRESSION    { $$ := newConstant( $8 , $9 )                              }
  788.             ;
  789.  
  790. COMPS                   : COMPONENT                                     { $$ := newComps( NIL , $1 )                                }
  791.             | COMPS COMPONENT                               { $$ := newComps( $1  , $2 )                                }
  792.             ;
  793.  
  794. COMPONENT               : TYPE IDELIST ';'                              { $$ := newComp( $1 , $2 )                                  }
  795.             ;
  796.  
  797. IDELIST                 : COMPRIGHT                                     { $$ := newIdeList( NIL , $1 )                              }
  798.             | IDELIST ',' COMPRIGHT                         { $$ := newIdeList( $1  , $3 )                              }
  799.             ;
  800.  
  801. COMPRIGHT               : POINTING IDEARRAYED                           { $$ := newCompRight( $1  , $2 )                            }
  802.             | IDEARRAYED                                    { $$ := newCompRight( NIL , $1 )                            }
  803.             ;
  804.  
  805. IDEARRAYED              : PID                                           { $$ := newIdeArrayed( $1 , 0  )                            }
  806.             | PID '[' PDECVALUE ']'                         { $$ := newIdeArrayed( $1 , $3 )                            }
  807.             | PID '[' PHEXVALUE ']'                         { $$ := newIdeArrayed( $1 , $3 )                            }
  808.             ;
  809.  
  810. CONDITIONAL             : '#' 'i' 'f' 'd' 'e' 'f' CONDRIGHT             { $$ := $7                                                  }
  811.             | '#' 'i' 'f' 'n' 'd' 'e' 'f' CONDRIGHT         { $$ := negotiateCond( $8 )                                 }
  812.             ;
  813.  
  814. CONDRIGHT               : PID INCLUDEFILE '#' 'e' 'n' 'd' 'i' 'f'       { $$ := newConditional( $1 , $2 )                           }
  815.             ;
  816.  
  817. INCFILE                 : '<' PATH '>'                                  { $$ := newIncfile( FALSE , $2 )                            }
  818.             | '"' PATH '"'                                  { $$ := newIncfile( TRUE  , $2 )                            }
  819.             ;
  820.  
  821. PATH                    : PID                                           { $$ := concatStr( $1  , '' )                               }
  822.             | PID PATH                                      { $$ := concatStr( $1  , $2 )                               }
  823.             | '.' PATH                                      { $$ := concatStr( '.' , $2 )                               }
  824.             | '/' PATH                                      { $$ := concatStr( '/' , $2 )                               }
  825.             ;
  826.  
  827. STRING                  : PID                                           { $$ := concatStr( $1                  , '' )               }
  828.             | PID STRING                                    { $$ := concatStr( $1                  , $2 )               }
  829.             | '.' STRING                                    { $$ := concatStr( '.'                 , $2 )               }
  830.             | '/' STRING                                    { $$ := concatStr( '/'                 , $2 )               }
  831.             | '\\' STRING                                   { $$ := concatStr( '\\'                , $2 )               }
  832.             | PHEXVALUE STRING                              { $$ := concatStr( asStr( $1 , TRUE  ) , $2 )               }
  833.             | PDECVALUE STRING                              { $$ := concatStr( asStr( $1 , FALSE ) , $2 )               }
  834.             ;
  835.  
  836. EXPRESSION              : '(' EXPRESSION ')'                            { $$ := $2                                                  }
  837.             | '~' EXPRESSION                                { $$ := newExpr( EXTYP_NEGOTIATE  , 0  , NIL , $2  , NIL )  }
  838.             | '-' EXPRESSION                                { $$ := newExpr( EXTYP_SIGNED     , 0  , NIL , $2  , NIL )  }
  839.             | '"' STRING '"'                                { $$ := newExpr( EXTYP_STRING     , 0  , $2  , NIL , NIL )  }
  840.             | PID                                           { $$ := newExpr( EXTYP_ID         , 0  , $1  , NIL , NIL )  }
  841.             | PHEXVALUE                                     { $$ := newExpr( EXTYP_HEXVALUE   , $1 , NIL , NIL , NIL )  }
  842.             | PDECVALUE                                     { $$ := newExpr( EXTYP_DECVALUE   , $1 , NIL , NIL , NIL )  }
  843.             | EXPRESSION '<' '<' EXPRESSION                 { $$ := newExpr( EXTYP_SHIFTLEFT  , 0  , NIL , $1  , $4  )  }
  844.             | EXPRESSION '>' '>' EXPRESSION                 { $$ := newExpr( EXTYP_SHIFTRIGHT , 0  , NIL , $1  , $4  )  }
  845.             | EXPRESSION '+' EXPRESSION                     { $$ := newExpr( EXTYP_PLUS       , 0  , NIL , $1  , $3  )  }
  846.             | EXPRESSION '-' EXPRESSION                     { $$ := newExpr( EXTYP_MINUS      , 0  , NIL , $1  , $3  )  }
  847.             | EXPRESSION '|' EXPRESSION                     { $$ := newExpr( EXTYP_BITOR      , 0  , NIL , $1  , $3  )  }
  848.             | EXPRESSION '&' EXPRESSION                     { $$ := newExpr( EXTYP_BITAND     , 0  , NIL , $1  , $3  )  }
  849.             | EXPRESSION '*' EXPRESSION                     { $$ := newExpr( EXTYP_MUL        , 0  , NIL , $1  , $3  )  }
  850.             | EXPRESSION '/' EXPRESSION                     { $$ := newExpr( EXTYP_DIV        , 0  , NIL , $1  , $3  )  }
  851.             ;
  852.  
  853. POINTING                : '*'                                           { $$ := newPointing( NIL )                                  }
  854.             | POINTING '*'                                  { $$ := newPointing( $1  )                                  }
  855.             ;
  856.  
  857. FUNC                    : TYPE POINTING FUNCRIGHT                       { $$ := newFunc( $1 , $2  , NIL , NIL , $3 )                }
  858.             | TYPE FUNCRIGHT                                { $$ := newFunc( $1 , NIL , NIL , NIL , $2 )                }
  859.             ;
  860.  
  861. FUNCRIGHT               : PID '(' ARGS ')' ';'                          { $$ := newFunc( NIL , NIL , $1 , $3 , NIL )                }
  862.             ;
  863.  
  864. VARIABLE                : TYPE IDELIST ';'                              { $$ := newVar( $1 , $2 )                                   }
  865.             ;
  866.  
  867. ARGS                    : ARGUMENT                                      { $$ := newArgs( NIL , $1 )                                 }
  868.             | ARGS ',' ARGUMENT                             { $$ := newArgs( $1  , $3 )                                 }
  869.             ;
  870.  
  871. ARGUMENT                : TYPE POINTING PID                             { $$ := newArgument( $1 , $2 , $3  )                        }
  872.             | TYPE POINTING                                 { $$ := newArgument( $1 , $2 , NIL )                        }
  873.             ;
  874.  
  875.  
  876. %%
  877.  
  878. ->> PROC yylex()
  879. PROC yylex()
  880. DEF lex_buffer [512] : STRING
  881. DEF lex_new          : PTR TO CHAR
  882. DEF lex_ptr,lex_first
  883.  
  884.   IF keyword <> NIL
  885.     lex_first := keyword[]++
  886.     IF keyword[] = 0 THEN keyword := NIL
  887.     RETURN lex_first
  888.   ENDIF
  889.  
  890.   IF ReadStr( glinput, lex_buffer ) = -1 THEN RETURN 0
  891.   lex_ptr   := lex_buffer
  892.   lex_first := lex_ptr[]++
  893.  
  894.   SELECT lex_first
  895. ->> CASE k
  896.   CASE "k"
  897.     lex_first := StrLen( lex_ptr ) + 1
  898.     lex_new   := New( lex_first )
  899.     IF lex_new = NIL THEN Raise( "MEM" )
  900.     AstrCopy( lex_new, lex_ptr, lex_first )
  901.     keyword   := lex_new + 1
  902.     RETURN lex_new[]
  903. -><
  904. ->> CASE i
  905.   CASE "i"
  906.     lex_first := StrLen( lex_ptr ) + 1
  907.     lex_new   := New( lex_first )
  908.     IF lex_new = NIL THEN Raise( "MEM" )
  909.     AstrCopy( lex_new, lex_ptr, lex_first )
  910.     RETURN PID, lex_new
  911. -><
  912. ->> CASE d
  913.   CASE "d"
  914.     RETURN PDECVALUE, Val( lex_ptr )
  915. -><
  916. ->> CASE h
  917.   CASE "h"
  918.     lex_ptr[1] := "$"
  919.     RETURN PHEXVALUE, Val( lex_ptr + 1 )
  920. -><
  921.   ENDSELECT
  922.  
  923. ENDPROC lex_ptr[]
  924. -><
  925.  
  926. ->> PROC yyerror()
  927. PROC yyerror( n )
  928.  
  929.   IF n = YYERRSTACK
  930.     WriteF( 'Parse stack overflow !\n> '      )
  931.   ELSEIF n = YYERRPARSE
  932.     WriteF( 'Parse error !\n' )
  933.   ENDIF
  934.  
  935. ENDPROC
  936. -><
  937.  
  938.  
  939.